#include <string>

#include "Grappin.h"

using namespace std;


Grappin::Grappin(std::string nom, int portee)
{
    m_nom="grappin";
    m_portee=3;
}


Grappin::~Grappin(){}


void Grappin::LancerGrappin(int X, int Y, TabDeCells* zoneDynamique, Zone* zon, char orientation, Personnage* lanceur)
{
//    Cellule* cible=0;
    int i = X;
    int j = Y;
    int compteur = 1;
    switch(orientation)//si l orientation est haut
    {
        case 'h' :
        j--; //on se met au dessus du personnage
        while (j != 0 && compteur!= 0 && compteur<=m_portee) // tant qu on atteint pas le bout de la carte ou la portee max du grappin, ou zero (sortie de la boucle)
        {
            if (zoneDynamique->GetAdresseDsCell(i,j) == 0 && zon->GetCharXY(i, j) == '.') //si la case dans les deux tableaux est "vide"
            {
                j--;
                compteur ++; //on vérifie la case suivante et on augmente le compteur pour comparer a la portee
            }
            else{ //sinon on prends les coordonnees de la case vide juste avant l'objet ( representee par i et j), et on sort de la boucle
                compteur = 0;
                j++;
            }
        }

        break;

        case 'b' : //si l'orientation est bas
        j++; //on se met en dessous du personnage
        while (j != (zoneDynamique->GetHauteur() -1) && compteur!= 0 && compteur<=m_portee) // tant qu on atteint pas le bout de la carte ou la portee max du grappin, ou zero (sortie de la boucle)
        {
            if (zoneDynamique->GetAdresseDsCell(i,j) == 0 && zon->GetCharXY(i, j) == '.') //si la case dans les deux tableaux est "vide"
            {
                j++;
                compteur ++; //on vérifie la case suivante et on augmente le compteur pour comparer a la portee
            }else{ //sinon on prends les coordonnees de la case vide juste avant l'objet ( representee par i et j), et on sort de la boucle
                compteur = 0;
                j--;
            }
        }


        break;

        case 'g' : //si l orientation est gauche :
        i--; //on se met a gauche du personnage
        while (i != 0 && compteur!= 0 && compteur<=m_portee) // tant qu on atteint pas le bout de la carte ou la portee max du grappin, ou zero (sortie de la boucle)
        {
            if (zoneDynamique->GetAdresseDsCell(i,j) == 0 && zon->GetCharXY(i, j) == '.') //si la case dans les deux tableaux est "vide"
            {
                i--;
                compteur ++; //on vérifie la case suivante et on augmente le compteur pour comparer a la portee
            }else{ //sinon on prends les coordonnees de la case vide juste avant l'objet ( representee par i et j), et on sort de la boucle
                compteur = 0;
                i++;
            }
        }

        break;

        case 'd' : //si l orientation est droite
        i++; //on se met a droite du personnage
        while (i != (zoneDynamique->GetLargeur() -1) && compteur!= 0 && compteur<=m_portee) // tant qu on atteint pas le bout de la carte ou la portee max du grappin, ou zero (sortie de la boucle)
        {
            if (zoneDynamique->GetAdresseDsCell(i,j) == 0 && zon->GetCharXY(i, j) == '.') //si la case dans les deux tableaux est "vide"
            {
                i++;
                compteur ++; //on vérifie la case suivante et on augmente le compteur pour comparer a la portee
            }else{ //sinon on prends les coordonnees de la case vide juste avant l'objet ( representee par i et j), et on sort de la boucle
                compteur = 0;
                i--;
            }
        }

        break;
    }
//bool poney=0;
//if (cible->GetAdresse()->GetVie() == -1){poney = 1;}
//assert(poney);

    if(compteur == 0) //cela veut dire que la case est valide a l utilisation du grappin
    {
        lanceur->SetXY(i,j);
    }
}

std::string Grappin::GetNomGrappin()
{return m_nom;}

int Grappin::GetPortee()
{return m_portee;}
